package com.sxj.corejava.code12_jdbc;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 石小俊
 * @date 2024年07月03日 14:46
 */
public class Test14_数据库连接池_druid {

    public static void main(String[] args) throws SQLException {
        test02();
    }

    public static void test01() throws SQLException {
        DruidDataSource ds = new DruidDataSource();
        // 配置数据库连接信息
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8");
        ds.setUsername("root");
        ds.setPassword("");

        // 配置初始化连接数:初始化连接池的时候申请的连接数量
        ds.setInitialSize(1);
        // 最大活跃数:表示最多有多少个连接被使用
        ds.setMaxActive(1);
        // 最大空闲连接数:保证连接池中最多存在多少个空闲连接
        ds.setMaxIdle(1);
        // 最小空闲连接数:保证连接池中至少存在多少个空闲连接
        ds.setMinIdle(1);

        // 最大等待时间,单位:毫秒
        // 当进入连接池中的时候没有连接,会等待其他用户归还
        // 当超出最大等待时间时,将不再等待,直接抛出等待超时异常
        ds.setMaxWait(3000);

        // 使用
        // 获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);

        // 归还连接,等待下一个用户使用
        conn.close();

        // 由于第一个用户归还了连接,此时该用户可以直接获取到连接
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);

        // 由于第二个用户没有归还连接,此时该用户等待用户2归还
        // 当超出最大等待时间之后,则不再等待,抛出等到超时的异常
        Connection conn3 = ds.getConnection();
        System.out.println(conn3);
    }

    public static void test02() {
        try {
            Properties p = new Properties();
            p.load(Test13_数据库连接池_dbcp.class.getClassLoader().getResourceAsStream("dataSource.properties"));
            DataSource ds = DruidDataSourceFactory.createDataSource(p);
            Connection conn = ds.getConnection();
            System.out.println(conn);
            conn.close();

            Connection conn2 = ds.getConnection();
            System.out.println(conn2);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
